home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / c / dicepj20.lha / diceproject / sources / chooseinlist.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-04  |  5.5 KB  |  245 lines

  1.  
  2. #include <intuition/intuition.h>
  3. #include <intuition/classes.h>
  4. #include <intuition/classusr.h>
  5. #include <intuition/imageclass.h>
  6. #include <intuition/gadgetclass.h>
  7. #include <libraries/gadtools.h>
  8.  
  9. #include <clib/exec_protos.h>
  10. #include <clib/intuition_protos.h>
  11. #include <clib/gadtools_protos.h>
  12.  
  13. #include <stdio.h>
  14. #include <ctype.h>
  15.  
  16. #include "project.h"
  17.  
  18. extern void ComputeFont( UWORD , UWORD );
  19.  
  20. extern UWORD ComputeX( UWORD );
  21. extern UWORD ComputeY( UWORD );
  22.  
  23. struct Window          *CListeWnd = NULL;
  24. struct Gadget          *CListeGList = NULL;
  25. struct Gadget          *CListeGadgets[3];
  26.  
  27. UWORD CListeGTypes[] = {
  28.     LISTVIEW_KIND,
  29.     BUTTON_KIND,
  30.     BUTTON_KIND
  31. };
  32.  
  33. struct NewGadget CListeNGad[] = {
  34.     3, 5, 267, 160, NULL , NULL, 1, PLACETEXT_ABOVE, NULL, NULL,
  35.     19 , 165 , 100 , 15 , (UBYTE *)"Edit" , NULL , 2 , PLACETEXT_IN , NULL , NULL,
  36.     155 , 165 , 100 , 15 , (UBYTE *)"Cancel" , NULL , 3 , PLACETEXT_IN , NULL , NULL,
  37. };
  38.  
  39. ULONG CListeGTags[] = {
  40.     (GT_Underscore), '_', (GTLV_ShowSelected), NULL, (TAG_DONE),
  41.     (GT_Underscore), '_', (TAG_DONE),
  42.     (GT_Underscore), '_', (TAG_DONE),
  43. };
  44.  
  45. int OpenCListeWindow( char *title )
  46. {
  47.     struct NewGadget    ng;
  48.     struct Gadget    *g;
  49.     UWORD        lc, tc;
  50.     UWORD        wleft = 205, wtop = 140, ww=274, wh=185;
  51.  
  52.     ComputeFont( 140 , 274 );
  53.  
  54.     ww = ComputeX( 274 );
  55.     wh = ComputeY( 185 );
  56.  
  57.     if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
  58.     if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;
  59.  
  60.     if ( ! ( g = CreateContext( &CListeGList )))
  61.         return( 1L );
  62.  
  63.     for( lc = 0, tc = 0; lc < 3; lc++ ) {
  64.  
  65.         CopyMem((char * )&CListeNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  66.  
  67.         ng.ng_VisualInfo = VisualInfo;
  68.         ng.ng_TextAttr     = Font;
  69.         ng.ng_LeftEdge = OffX + ComputeX( ng.ng_LeftEdge );
  70.         ng.ng_TopEdge = OffY + ComputeY( ng.ng_TopEdge );
  71.         ng.ng_Width = ComputeX( ng.ng_Width );
  72.         ng.ng_Height = ComputeY( ng.ng_Height);
  73.  
  74.         if ( !lc )
  75.             ng.ng_GadgetText = title;
  76.         CListeGadgets[ lc ] = g = CreateGadgetA((ULONG)CListeGTypes[ lc ], g, &ng, ( struct TagItem * )&CListeGTags[ tc ] );
  77.  
  78.         while( CListeGTags[ tc ] ) tc += 2;
  79.         tc++;
  80.  
  81.         if ( NOT g )
  82.             return( 2L );
  83.     }
  84.  
  85.     if ( ! ( CListeWnd = OpenWindowTags( NULL,
  86.                 WA_Left,    wleft,
  87.                 WA_Top,     wtop,
  88.                 WA_Width,    ww + OffX + Scr->WBorRight,
  89.                 WA_Height,    wh + OffY + Scr->WBorBottom,
  90.                 WA_IDCMP,    LISTVIEWIDCMP|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|IDCMP_RAWKEY,
  91.                 WA_Flags,    WFLG_SMART_REFRESH,
  92.                 WA_Gadgets,    CListeGList,
  93.                 WA_Activate,    TRUE,
  94.                 WA_PubScreen,         Scr,
  95.                 TAG_DONE )))
  96.     return( 4L );
  97.  
  98.     GT_RefreshWindow( CListeWnd, NULL );
  99.  
  100.     return( 0L );
  101. }
  102.  
  103. void CloseCListeWindow( void )
  104. {
  105.     if ( CListeWnd        ) {
  106.         CloseWindow( CListeWnd );
  107.         CListeWnd = NULL;
  108.     }
  109.  
  110.     if ( CListeGList      ) {
  111.         FreeGadgets( CListeGList );
  112.         CListeGList = NULL;
  113.     }
  114. }
  115.  
  116.  
  117. void UpDateList( long select ) {
  118.   long topsel;
  119.  
  120.     GT_SetGadgetAttrs( CListeGadgets[0] , CListeWnd , NULL , GTLV_Selected , select , TAG_DONE );
  121.     topsel = select-5;
  122.     if ( topsel<0 )
  123.     topsel = 0;
  124.     GT_SetGadgetAttrs( CListeGadgets[0] , CListeWnd , NULL , GTLV_Top , topsel , TAG_DONE );
  125. }
  126.  
  127. /****************************************************************
  128. ***    Affiche une liste ou choisir un élément           ***
  129. ****************************************************************/
  130.  
  131. struct Node *ChooseInList( char *title , struct List *liste , long x , long y ) {
  132.   BOOL            done=FALSE;
  133.   struct IntuiMessage    *m;
  134.   ULONG         sec=-1,mic;
  135.   int            n;
  136.   struct Node        *wn=NULL;
  137.   long            select;
  138.  
  139.     SleepWinC( );
  140.     if ( !OpenCListeWindow( title ) ) {
  141.     GT_SetGadgetAttrs( CListeGadgets[0] , CListeWnd , NULL , GTLV_Labels , (long)liste , TAG_DONE );
  142.     while ( !done ) {
  143.         Wait( 1 << CListeWnd->UserPort->mp_SigBit );
  144.         while( m = GT_GetIMsg( CListeWnd->UserPort )) {
  145.         GT_ReplyIMsg( m );
  146.         switch ( m->Class ) {
  147.           case IDCMP_CLOSEWINDOW:
  148.             wn = NULL;
  149.             done = TRUE;
  150.             break;
  151.           case IDCMP_GADGETUP:
  152.             n = ((struct Gadget *)m->IAddress)->GadgetID;
  153.             switch( n ) {
  154.               case 1:
  155.             select = n = m->Code;
  156.             wn = liste->lh_Head;
  157.             while( wn->ln_Succ && n-- ) {
  158.                 wn = wn->ln_Succ;
  159.             }
  160.             if ( sec != -1 && DoubleClick( sec , mic , m->Seconds , m->Micros ) )
  161.                 done = TRUE;
  162.             sec = m->Seconds;
  163.             mic = m->Micros;
  164.             break;
  165.               case 3:
  166.             wn = NULL;
  167.               case 2:
  168.             done = TRUE;
  169.             break;
  170.             }
  171.             break;
  172.         case    IDCMP_RAWKEY:
  173.             switch( m->Code ) {
  174.               case CURSORUP:
  175.             if ( !wn ) {
  176.                 wn = liste->lh_Head;
  177.                 select = 0;
  178.                 while( wn->ln_Succ->ln_Succ ) {
  179.                 wn = wn->ln_Succ;
  180.                 select++;
  181.                 }
  182.             } else {
  183.                 if ( wn->ln_Pred->ln_Pred ) {
  184.                 wn = wn->ln_Pred;
  185.                 select--;
  186.                 }
  187.             }
  188.             UpDateList( select );
  189.             break;
  190.               case CURSORDOWN:
  191.             if ( !wn ) {
  192.                 wn = liste->lh_Head;
  193.                 select = 0;
  194.             } else {
  195.                 if ( wn->ln_Succ->ln_Succ ) {
  196.                 wn = wn->ln_Succ;
  197.                 select++;
  198.                 }
  199.             }
  200.             UpDateList( select );
  201.             break;
  202.             }
  203.             break;
  204.  
  205.           case IDCMP_VANILLAKEY:
  206.             switch( m->Code ) {
  207.               case 27:
  208.             wn = NULL;
  209.               case 13:
  210.             done = TRUE;
  211.             break;
  212.               default:
  213.             if ( isalpha( m->Code ) )
  214.             {
  215.               struct ModuleNode *bn;
  216.               BOOL found = FALSE;
  217.               long sel = 0;
  218.  
  219.                 bn = liste->lh_Head;
  220.                 m->Code = tolower( m->Code );
  221.                 while( bn->node.ln_Succ && !found ) {
  222.                 if ( tolower(*bn->node.ln_Name) == m->Code ) {
  223.                     found = TRUE;
  224.                     break;
  225.                 }
  226.                 sel++;
  227.                 bn = bn->node.ln_Succ;
  228.                 }
  229.                 if ( found ) {
  230.                 wn = bn;
  231.                 select = sel;
  232.                 UpDateList( sel );
  233.                 }
  234.             }
  235.             break;
  236.             }
  237.         }
  238.         }
  239.     }
  240.     CloseCListeWindow( );
  241.     }
  242.     AwakeWinC( );
  243.     return( wn );
  244. }
  245.